/*
 * Tangram
 * Copyright 2009 Baidu Inc. All rights reserved.
 * 
 * path: baidu/page/load.js
 * author: rocy
 * version: 1.0.0
 * date: 2010/11/29
 */

///import baidu.page;
///import baidu.dom.insertHTML;
///import baidu.array.each;
///import baidu.ajax.get;

/**
 * 
 * 加载一组资源,支持多种格式资源的串/并行加载,支持每个文件有单独回调函数.
 * @param resources {Array} 资源描述数组,单个resource含如下属性
 * 	@config url  {String} 链接地址
 * 	@config type {String} 取值空间["css","js","html"] optional 默认参考文件后缀
 * 	@config requestType {String} ["dom","ajax"] optional 默认js和css用dom标签,html用ajax
 * 	@config onload {Function} 当前resource加载完成的回调函数,
 * 				若requestType为ajax,参数为xhr(可能失效),responseText;
 * 				若requestType为dom, 无参数,执行时this为相应dom标签.
 * 	@config charset {String} NOT SUPPORTED YET! resource的charset,默认UTF8.
 * @param options {Object} 可选参数 
 * 	@config onload {Function} 资源全部加载完成的回调函数,无参数.
 * 	@config parallel {Boolean} 是否并行加载,默认为false,串行.
 * 
 * 
 * @usage
 * 	//串行实例
 * 	baidu.page.load([
 * 		{ url : "http://img.baidu.com/js/tangram-1.3.2.js" },
 * 		{url : "http://xxx.baidu.com/xpath/logicRequire.js",
 * 			onload : fnOnRequireLoaded
 * 		},
 * 		{ url : "http://xxx.baidu.com/xpath/target.js" }
 * 	],{
 * 		onload : fnWhenTargetOK
 * 	});
 * 	//并行实例
 * 	baidu.page.load([
 * 		{ 
 * 			url : "http://xxx.baidu.com/xpath/template.html",
 * 			onload : fnExtractTemplate
 * 		},
 * 		{ url : "http://xxx.baidu.com/xpath/style.css"},
 * 		{ 
 * 			url : "http://xxx.baidu.com/xpath/import.php?f=baidu.*",
 * 			type : "js"
 * 		},
 * 		{
 * 			url : "http://xxx.baidu.com/xpath/target.js",
 * 		},
 * 		{
 * 			url : "http://xxx.baidu.com/xpath/jsonData.js",
 * 			requestType : "ajax",
 * 			onload : fnExtractData
 * 		}
 * 	],{
 * 		parallel : true,
 * 		onload : fnWhenEverythingIsOK
 * });
 */
 
//XXX codereview
// 第一个参数支持字符串
// 注意内存泄露
// 整体onload能不能每个都调用
// 
//TODO failure
baidu.page.load = function(resources,options){
	//TODO: cache
	options = options || {};
	var pkg = baidu.page.load,
		cache = pkg._cache = pkg._cache || {}
		;
	function allLoadedChecker(){
		baidu.each(resources, function(res){
			if(!cache[res.url]){
				return;
			}
		});
		options.onload();
	};
	function page(res, callback){
		var node;
		switch(res.type){
			case "css":
				node = document.createElement("link");
				node.setAttribute("rel", "stylesheet");
		    	node.setAttribute("type", "text/css");
		    	break;
		    case "js":
		    	node = document.createElement("script");
		    	node.setAttribute('type', 'text/javascript');
				break;
			case "html":
				node = document.createElement("iframe");
				node.frameBorder = "none";
				break;
			default: return;
		};
    	// JS works on all browsers, CSS works only on IE.
		node.onload = node.onreadystatechange = function() {
			if ( (!this.readyState ||
					this.readyState === "loaded" || this.readyState === "complete") ) {
				// 防止内存泄露
				node.onload = node.onreadystatechange = null;
				callback.call(node);
			}
		};
		//hack css no onload for firefox,webkit
		if(res.type == 'css'){
			(function(){
				try {
					node.sheet.cssRule;
				} catch (e) {
					setTimeout(arguments.callee, 20);
					return;
				}
				callback.call(node);
			})();
		}
		
		node.href = node.src = res.url;
		document.body.appendChild(node);
	}
	
	//兼容第一个参数直接是资源地址.
	if(typeof resources == 'string'){
		resources = [{url: resources}];
	}
	
	baidu.each(resources,function(res){
		//FIXME 串行支持.
		var url = res.url,
			callback = function(){
				//ajax存入responseText,dom存入节点,用于保证onload的正确执行.
				cache[res.url] = this || arguments;
				typeof res    .onload == 'function' && res.onload.apply(this,arguments);
				typeof options.onload == 'function' && allLoadedChecker();
			},
			cacheData;
		if(!res.type){
			res.type = url.substr(url.lastIndexOf(".") + 1);
		}
		//默认html格式用ajax请求,其他都使用dom标签方式请求.
		if(!res.requestType){
			res.requestType = res.type == "html" ? "ajax" : "dom";
		}
		
		if(cacheData = cache[res.url]){
			callback.apply(cacheData, cacheData);
			return;
		}
		
		if(res.requestType.toLowerCase() == "dom"){
			page(res, callback);
		}else{//ajax
			baidu.ajax.get(res.url, callback);
		}
	});
};